package com.dingding.nettyserver.core.codec;

import com.dingding.nettyserver.common.trasferrule.response.Response;
import com.dingding.nettyserver.core.config.constant.PacketConst;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 服务器响应给客户端的数据包
 * 
 * <pre>
 * +——----——+——-----——+——----——+——----——+——-----——+——----——+——----——+
 * |  包头	| 业务类型     | 模块号      |  命令号    |  结果码      |  长度       |   数据      |
 * +——----——+——-----——+——----——+——----——+——-----——+——----——+——----——+
 * </pre>
 * 
 * 包头4字节 
 * 业务类型1字节 
 * 模块号2字节 
 * 命令号2字节 
 * 结果码4字节 
 * 长度4字节(数据部分占有字节数量)
 */
public class ResponseEncoder extends MessageToByteEncoder<Response> {

	@Override
	protected void encode(ChannelHandlerContext ctx, Response response, ByteBuf buffer) throws Exception {

		// 包头
		buffer.writeInt(PacketConst.HEADER_FLAG);

		// 业务类型
		buffer.writeByte(response.getBizType());

		// 模块号
		buffer.writeShort(response.getModule());

		// 命令号
		buffer.writeShort(response.getCmd());

		// 结果码
		buffer.writeInt(response.getStateCode());

		// 长度
		int lenth = response.getData() == null ? 0 : response.getData().length;

		if (lenth <= 0) {
			buffer.writeInt(lenth);
		} else {
			buffer.writeInt(lenth);
			buffer.writeBytes(response.getData());
		}

	}
}
